#ifndef _ICAR_END_MSG_H
#define _ICAR_END_MSG_H

#include "icar_msg.h"

#if defined(__cplusplus)
extern "C" {
#endif

/* 报警标志位定义 */
#define ALARM_EMERGENCY 			0x01			// 1:紧急报警,触动报警开关后触发
#define ALARM_OVERSPEED				0x02			// 1:超速报警
#define ALARM_FATIGUE_DRIVE			0x04			// 疲劳驾驶 
#define ALARM_RISK_WARN				0x08			// 危险预警
#define ALARM_GNSS_FAILURE			0x10		// GNSS 模块发生故障
#define ALARM_GNSS_ANTENA_OFF		0x20		// GNSS 天线未接或被剪断
#define ALARM_GNSS_ANTENA_CIRCUIT	0x40 		// GNSS 天线短路
#define ALARM_POWER_VOL_LACK		0x80		// 终端主电源欠压
#define ALARM_POWER_OFF				0x0100		// 终端主电源掉电
#define ALARM_LCDORSCREEN_FAIL		0x0200		// 终端 LCD 或显示器故障
#define ALARM_TTS_FAILURE			0x0400		// TTS 模块故障
#define ALARM_CAMERA_FAILURE		0x0800		// 摄像头故障

#define ALARM_OVER_WARN				0x2000		// 超速预警
#define ALARM_FATIGUE_WARN			0x4000		// 疲劳驾驶预警
#define ALARM_DRIVE_TIMEOUT			0x40000 	// 当天累计驾驶超时
#define ALARM_PARK_TIMEOUT			0x80000 	// 超时停车
#define ALARM_IMPORT_REGION			0x0100000 	// 进出区域
#define ALARM_IMPORT_ROUTINE		0x0200000	// 进出路线
#define ALARM_INSUFFI_LONG			0x0400000	// 路段行驶时间不足/过长
#define ALARM_ROUTE_DEVIATION		0x0800000 	// 路线偏离报警
#define ALARM_VSS_FAILURE			0x1000000	// 车辆 VSS 故障
#define ALARM_FUEL_EXCEPTION		0x2000000	// 车辆油量异常
#define ALARM_STOLEN				0x4000000 	// 车辆被盗(通过车辆防盗器)
#define ALARM_ILLEGAL_IGNITION		0x8000000	// 车辆非法点火
#define ALARM_ILLEGAL_OFFSET		0x010000000	// 车辆非法位移
#define ALARM_COLLISION				0x020000000	// 碰撞报警
#define ALARM_ROLLVER				0x040000000	// 侧翻报警
#define ALARM_ILLEGAL_OPEN			0x080000000	// 1:非法开门报警(终端未设置区域时,不判断非法开门)



/* 状态位定义 */
#define STATUS_ACC			0x01				// 0: ACC 关;1:ACC 开
#define STATUS_LOCAL		0x02				// 0:未定位;1:定位
#define STATUS_LATITUDE		0x04				// 0:北纬:1:南纬
#define STATUS_LONGITUDE	0x08				// 0:东经;1:西经
#define STATUS_OPERATE		0x10				// 0:运营状态:1:停运状态
#define STATUS_ENCRYPT		0x20				// 0:经纬度未经保密插件加密;l:经纬度已经保密插件加密
#define STATUS_FULL_LOAD	0x0300				/* 
		00:空车;01:半载;10:保留;11:满载 
	 	(可用于客车的空、重车及货车的空载、满载状态表示,
		人工输入或传感器获取) */
#define STATUS_VEHICLE_OIL	0x0400				// 0:车辆油路正常:1:车辆油路断开
#define STATUS_CIRCUIT		0x0800				// 0:车辆电路正常:1:车辆电路断开
#define STATUS_DOOR_LOCK	0x1000				// 0:车门解锁;1:车门加锁
#define STATUS_DOOR1_OPEN	0x2000				// 0:门 1 关;1:门 1 开(前门)
#define STATUS_DOOR2_OPEN	0x4000				// 0:门 2 关;1:门 2 开(中门)
#define STATUS_DOOR3_OPEN	0x8000				// 0:门 3 关;1:门 3 开(后门)
#define STATUS_DOOR4_OPEN	0x010000			// 0:门 4 关;1:门 4 开(驾驶席门)
#define STATUS_DOOR5_OPEN	0x020000			// 0:门 5 关;1:门 5 开(自定义)
#define STATUS_GPS_LOCATE	0x040000			// 0:未使用 GPS 卫星进行定位;1:使用 GPS 卫星进行定位
#define STATUS_BEIDOU_LOCATE	0x080000		// 0:未使用北斗卫星进行定位;1:使用北斗卫星进行定位
#define STATUS_GLONASS_LOCATE	0x100000		// 0:未使用 GLONASS 卫星进行定位;1:使用 GLONASS 卫星进行定位
#define STATUS_GALILEO_LOCATE	0x200000		// 0:未使用 Galileo 卫星进行定位;1:使用 Galileo 卫星进行定位






/* 终端通用应答 */
struct endResponse {
	uint16_t sequence;		/* 应答流水号: 对应平台消息的流水号 */
	uint16_t id;			/* 应答ID: 对应的平台消息的ID*/
	uint8_t result;			/* 结果: 0：成功/确认；1：失败；2：消息有误；3：不支持 */
};

/* 终端鉴权 */
struct endAuth {
	char *code;			/* 鉴权码 终端重连后上报鉴权码 */
	size_t len;			/* 鉴权码长度(包括终止字符'\0' */
};

/* 终端属性应答 */
struct endAttr {
	uint16_t type;			/* 终端类型 */
	uint8_t product[5];		/* 制造商ID */
	uint8_t model[20];		/* 终端型号 */
	uint8_t	endId[7];		/* 终端ID */
	uint8_t iccid[10];		/* 终端SIM卡 ICCID 号*/
	uint8_t hverLen;			/* 终端硬件版本号长度 */
	char	hversion[256];	/* 终端硬件版本号 */
	uint8_t fverLen;		/* 终端固件版本号长度 */
	char	fversion[256];	/* 终端固件版本号 */
	uint8_t gnss;			/* GNSS 模块属性 */
	uint8_t communication;	/* 通信模块属性 */
};

/* 终端升级结果通知 */
struct endUpdateNote {
	uint8_t type;			/* 0:终端 12:道路运输证IC卡读卡器，52:北斗卫星定位模块 */
	uint8_t result;			/* 0:成功 1:失败 2:取消 */
};




/* 扩展车辆信号状态位 */
#define EXSIG_DIPPED		0x01	/* 近光灯信号 */
#define EXSIG_HIGH_LIGHT	0x02	/* 远光灯信号 */
#define EXSIG_RIGHT_TURN	0x04	/* 右转向灯信号 */
#define EXSIG_LEFT_TURN		0x08	/* 左转向灯信号 */
#define EXSIG_BRAKE			0x10	/* 制动信号 */
#define EXSIG_REVERSE		0x20	/* 倒档信号 */
#define EXSIG_FOG_LIGHT		0x40	/* 雾灯信号 */
#define EXSIG_CONTOUR		0x80	/* 示廓灯 */
#define EXSIG_HORN			0x0100	/* 喇叭信号 */
#define EXSIG_AIRCONTION	0x0200	/* 空调状态 */
#define EXSIG_NEUTRAL		0x0400	/* 空挡信号 */
#define EXSIG_RETARDER		0x0800	/* 缓速器工作 */
#define EXSIG_ABS_WORK		0x1000	/* ABS 工作 */
#define EXSIG_HEATER		0x2000	/* 加热器工作 */
#define EXSIG_CLUTCH		0x4000	/* 离合器状态 */

/* IO 状态位 */
#define IO_DEEP_SLEEP		0x01	/* 深度休眠状态 */
#define IO_SLEEP			0x02	/* 休眠状态 */


#define ADDID_MILEAGE		0x01	/* 里程,DWORD,1/10km,对应车上里程表读数 */
#define ADDID_OIL			0x02	/* 油量,WORD,1/10L,对应车上油量表读数 */
#define ADDID_SPEED			0x03	/* 行驶记录功能获取的速度,WORD,1/10km/h */
#define ADDID_ALARM_ID		0x04	/* 需要人工确认报警事件的 ID,WORD,从 1 开始计数 */
#define ADDID_OSPEED_ALARM	0x11	/* 超速报警附加信息 */
#define ADDID_ROUTEINFO		0x12	/* 进出区域/路线报警附加信息 */
#define ADDID_DRIVE_INSULONG	0x13	/* 路段行驶时间不足/过长报警附加信息 */
#define ADDID_SIGSTATUS		0x25	/* 扩展车辆信号状态位 */
#define ADDID_IOSTATUS		0x2A	/* IO 状态位 */
#define ADDID_ANALOG		0x2B	/* 模拟量,bit0-15,AD0;bit16-31,AD1。 */
#define ADDID_WIRELESS		0x30	/* 无线通信网络信号强度 */
#define ADDID_GNSS			0x31	/* GNSS 定位卫星数 */
#define ADDID_CUSTOM		0xE0	/* 后续信息长度 后续自定义信息长度 */

#define ADDID_ALARM_DATA	0xE1	/* 报警数据包 */
#define ADDID_OBD_DATA		0xE2	/* OBD 数据包 */
#define ADDID_FAULT_DATA	0xE3	/* 故障码数据包 */
#define ADDID_VEHICLE_INFO	0xE4	/* 车辆信息数据包 */
#define ADDID_END_VERSION	0xE5	/* 终端版本信息包 */
#define ADDID_BASE_DATA		0xE6	/* BASE 基本数据包 */
#define ADDID_SHARP_SLOWDOWN	0xF1	/* 急减速事件场景数据包 */
#define ADDID_SHARP_SPEEDUP		0xF2	/* 急加速事件场景数据包 */
#define ADDID_SHARP_TURN		0xF3	/* 急转弯事件场景数据包 */
#define ADDID_OVERSPEED_SCN		0xF4	/* 超速事件场景数据包 */
#define ADDID_SHARP_BRAKE		0xF5	/* 急刹车事件场景数据包 */
#define ADDID_COLLISION			0xF6	/* 碰撞事件场景数据包 */

/* 超速报警附加信息消息体数据格式 */
struct overSpeedAlarmInfo {
	uint8_t type;		/* 位置类型  0:无特定位置; 1:圆形区域; 2:矩形区域;
							3:多边形区域; 4:路段 */
	uint32_t areaId;	/* 区域或路段ID 若位置类型为0，无该字段 */
};

/* 进出区域/路线报警附加信息消息体数据格式 */
struct routeInfo {
	uint8_t type;			/* 位置类型 1:圆形区域;
									2:矩形区域;
									3:多边形区域;
									4:路段
						 	*/
	uint8_t  direction;		/* 方向 0:进; 1:出 */
	uint32_t routeId;		/* 区域或线路ID */
};

/* 路线行驶时间不足/过长报警附加信息消息体数据格式 */
struct driveInsuLong {
	uint32_t rSecID;		/* 路段ID */
	uint16_t driveTime;		/* 路段行驶时间 单位为秒 (s) */
	uint8_t  result;		/*  结果 0:不足；1：过长*/
};

/*  报警数据包 */
struct alarm {
	uint8_t key1;		/* Alarm Byte1 报警关键字 1 */
	uint8_t key2;		/* Alarm Byte2 报警关键字 2 */
	uint8_t key3;		/* Alarm Byte3 报警关键字 3 */
	short xup;			/* 碰撞时 X 轴加速度 (精度 0.1G) 最高位表示符号,1 为负数,0 为正数 */
	short yup;			/* 碰撞时 Y 轴加速度 (精度 0.1G) 最高位表示符号,1 为负数,0 为正数 */
	short zup;			/* 碰撞时 Z 轴加速度 (精度 0.1G) 最高位表示符号,1 为负数,0 为正数 */
	uint16_t duration;	/* 车辆怠速持续时间长度 0~65535 单位:分钟 */
};

/* OBD 数据包 */
struct obd {
};


/* 位置附加信息项格式 */
struct localAddInfo {
	uint8_t id;					/* 附加信息 ID 1-255 */
	uint8_t len;				/*  附加信息长度 */
	union {
		uint32_t mileage;		/* 里程,DWORD,1/10km,对应车上里程表读数 */
		uint16_t oil;			/* 油量,WORD,1/10L,对应车上油量表读数 */
		uint16_t speed;			/* 行驶记录功能获取的速度,WORD,1/10km/h */
		uint16_t alarmId;		/* 需要人工确认报警事件的 ID,WORD,从 1 开始计数 */
		struct overSpeedAlarmInfo over;	/* 超速报警附加信息 */
		struct routeInfo route;		/* 进出区域/路线报警附加信息 */
		struct driveInsuLong time;			/* 路段行驶时间不足/过长报警附加信息 */
		uint32_t exsig;				/* 扩展车辆信号状态位 */
		uint16_t io;				/* IO 状态位 */
		uint32_t analog;			/* 模拟量,bit0-15,AD0;bit16-31,AD1 */
		uint8_t  netsig;			/* 无线通信网络信号强度 */
		uint8_t  gnssNo;			/* GNSS 定位卫星数 */
		struct alarm alarm;			/* 报警数据包 */
	} val;
};

/* 位置信息 */
struct endLocalInfo {
	uint32_t alarm;			/* 报警标志 */
	uint32_t status;			/* 状态 */
	uint32_t latitude;		/* 纬度 以度为单位的纬度值乘以10的6次方，精确到百万分之一度 */
	uint32_t longitude;		/* 经度 */
	uint16_t elevation;		/* 高程 海拔高度，单位为米(m) */
	uint16_t speed;			/* 速度 1/10Km/h */
	uint16_t direction;		/* 方向 0-359，正北为0，顺时针 */
	uint8_t  timebcd[6];	/* 时间 YY-MM-DD-hh-mm-ss(GMT+8时间) */
};

/* 位置信息汇报 */
struct endLocalReport {
	struct endLocalInfo info;		/* 位置基本信息 */
	struct localAddInfo *list;		/* 位置附加信息项列表 */
};

/* 位置信息查询应答 */
struct localInfoResponse {
	uint16_t  sequence;				/* 应答流水号 */
	struct endLocalInfo info;		/* 位置信息汇报 */
	struct localAddInfo *list;		/* 位置附加信息项列表 */
};

/* 提问应答 */
struct askRes {
	uint16_t sequence;		/* 应答流水号 对应的提问下发消息的流水号*/
	uint8_t resId;			/* 答案ID 提问下发中附带的答案 ID */
};

/* 信息点播/取消 */
struct infoBC {
	uint8_t type;			/* 信息类型 */
	uint8_t mark;			/* 点播/取消标志 0:取消;1:点播 */
};

/* 车辆控制应答 */
struct vehicleCtlRes {
	uint16_t sequence;		/* 应答流水号 对应的车辆控制消息的流水号 */
	struct endLocalInfo info;	/* 位置信息汇报消息体 根据对应的状态位判断控制成功与否 */
};

/* 行驶记录数据上传 */
struct recoderUpload {
	uint16_t sequence;			/* 对应的行驶记录数据采集命令消息的流水号 */
	uint8_t cmd;				/* 对应平台发出的命令字 */
	void *data;					/* 数据块内容格式见 GB/T 19056 中相关内
								 容,包含 GB/T 19056 要求的完整数据
								 包。*/
	size_t len;					/* 数据块长度 */
};

/* 电子运单上报 */
struct elecWaybillReport {
	uint32_t len;				/* 电子运单长度 */
	uint8_t *data;				/* 电子运单数据包 */
};

/* 驾驶员身份信息采集上报 */
struct driverIdRep {
	uint8_t status;			/* 0x01:从业资格证 IC 卡插入(驾驶员上班);
							0x02:从业资格证 IC 卡拔出(驾驶员下班)。*/
	uint8_t tbcd[6];		/* 插卡/拔卡时间,YY-MM-DD-hh-mm-ss;
							 以下字段在状态为 0x01 时才有效并做填充。 */
	uint8_t icres;			/* IC 卡读取结果
							0x00:IC 卡读卡成功;
							0x01:读卡失败,原因为卡片密钥认证未通过;
							0x02:读卡失败,原因为卡片已被锁定;
							0x03:读卡失败,原因为卡片被拔出;
							0x04:读卡失败,原因为数据校验错误。
							以下字段在 IC 卡读取结果等于 0x00 时才有效。
							 */
	uint8_t nlen;			/* 驾驶员姓名长度 */
	char	*name;			/* 驾驶员姓名 */
	char	certification[20];		/* 从业资格证编码 长度 20 位,不足补 0x00。 */
	uint8_t orgarlen;		/* 发证机构名称长度 */
	char	*organization;	/* 发证机构名称 从业资格证发证机构名称 */
	uint8_t validaty[4];		/* 证件有效期 YYYYMMDD */
};

/* 定位数据批量上传 */
struct localBulkUpload {
	uint16_t count;			/* 数据项个数 包含的位置汇报数据项个数,>0 */
	uint8_t type;			/* 位置数据类型 0:正常位置批量汇报,1:盲区补报 */
	/* */
};

/* CAN 总线数据项数据格式 */
struct can_data {
	uint8_t id[4];		/* bit31 表示 CAN 通道号,0:CAN1,1:CAN2;
						 bit30 表示帧类型,0:标准帧,1:扩展帧;
						 bit29 表示数据采集方式,0:原始数据,1:采集区间
						 的平均值;
						 bit28-bit0 表示 CAN 总线 ID*/
	uint8_t data[8];	/* CAN 数据 */
};

/* CAN 总线数据上传 */
struct canUpload {
	uint16_t count; 	/* 数据项个数 包含的 CAN 总线数据项个数,>0 */
	uint8_t rtime[5];	/* CAN 总线数据接收时间 
						   第 1 条 CAN 总线数据的接收时间,hh-mm-ss-msms */
	struct can_data d[0];	/* CAN 总线数据项 */
};

/* 多媒体事件信息上传 */
struct mediaEvent {
	uint32_t id;			/* 多媒体数据 ID */
	uint8_t  type;			/* 多媒体类型 0:图像;1:音频;2:视频; */
	uint8_t  format;		/* 多媒体格式编码 0:JPEG;1:TIF;2:MP3;3:WAV;4:WMV; 其他保留 */
	uint8_t  event;			/* 事件项编码
							0: 平台下发指令;
							1: 定时动作;
							2:抢劫报警触发;
							3:碰撞侧翻报警触发;
							4:门开拍照;
							5:门关拍照;
							6: 车门由开变关,时速从<20 公里到超过 20 公里;
							7:定距拍照; 
							其他保留*/
	uint8_t channel;		/* 通道 ID */
};

/* 多媒体数据上传 */
struct mediaData {
	uint32_t id;			/* 多媒体 ID */
	uint8_t  type;			/* 多媒体类型 0:图像;1:音频;2:视频; */
	uint8_t  format;		/* 多媒体格式编码 0:JPEG;1:TIF;2:MP3;3:WAV;4:WMV; 其他保留 */
	uint8_t event;			/* 事件项编码 
							0: 平台下发指令;
							1: 定时动作;
							2:抢劫报警触发;
							3:碰撞侧翻报警触发;
							 其他保留*/
	uint8_t channel;		/* 通道 ID */
	struct endLocalInfo local;			/* 位置信息汇报(0x0200)消息体
								 表示多媒体数据的位置基本信息数据
								 */
	uint8_t *data;			/* 多媒体数据包 */
	size_t	len;			/* 数据包长度 */
};


/* 摄像头立即拍摄命令应答 */
struct cameraFilmRes {
	uint16_t sequence;		/* 应答流水号 对应平台摄像头立即拍摄命令的消息流水号 */
	uint16_t count;			/* 多媒体 ID 个数: 拍摄成功的多媒体个数 */
	uint8_t result;			/* 0:成功;1:失败;2:通道不支持。 以下字段在结果=0 时才有效。 */
};





/* 多媒体检索项数据格式 */
struct mediaRetrive {
	uint32_t id;		/* 多媒体 ID */
	uint8_t type;		/* 多媒体类型 0:图像;1:音频;2:视频 */
	uint8_t channel;	/* 通道 ID */
	uint8_t format;		/* 事件项编码 
						0: 平台下发指令;1: 定时动作;2:抢劫报警
						 触发;3:碰撞侧翻报警触发;其他保留*/
	struct endLocalInfo local;	/* 位置信息汇报 (0x0200)消息体 
								 表示拍摄或录制的起始时刻的位置基本信息数据
								*/
};

/* 存储多媒体数据检索应答 */
struct storeMediaRep {
	uint16_t sequence;		/* 应答流水号 对应的多媒体数据检索消息的流水号 */
	uint16_t total;			/* 多媒体数据总项数 满足检索条件的多媒体数据总项数 */
	struct mediaRetrive op[0];	/* 检索项 */
};





/* 数据上行透传 */
struct dataUpTrans {
	uint8_t type;			/* 透传消息类型 */
	uint8_t *data;			/* 透传消息 */
	size_t len;				/* 透传消息长度 */
};

/* 数据压缩上报 */
struct dataCompress {
	uint32_t len;		/* 压缩消息长度 */
	uint8_t *data;		/* 压缩消息体 
						   压缩消息体为需要压缩的消息经过 GZIP
						   压缩算法后的消息*/
};


/* 终端 RSA 公钥 */
struct endRsaEncrypt {
	uint32_t e;				/*  终端 RSA 公钥{e,n}中的 e*/
	uint8_t n[128];			/* RSA 公钥{e,n}中的 n */
};

struct icar_iovec *end_response(int, const char *, struct endResponse *);


struct icar_iovec *end_heart_beat(int, const char *);

struct icar_iovec *end_end_register(int, const char *, struct endRegister *);

struct icar_iovec *end_unregister(int, const char *);

struct icar_iovec *end_auth(int, const char *, const char *code, size_t len);

struct icar_iovec *end_update_notice(int, const char *, uint8_t , uint8_t );

struct icar_iovec *end_event_report(int, const char *, uint8_t id);

struct icar_iovec *end_ask_response(int, const char *, uint16_t sequence, uint8_t id);

struct icar_iovec *end_infoMenu_cancel(int, const char *, uint8_t type, uint8_t flag);

#if defined(__cplusplus)
}
#endif

#endif
